using System;
using System.Collections.Generic;
using System.Text;
using PerfilEmpreendedor.Bo.Model;
using PerfilEmpreendedor.Dao.Interfaces;
using NHibernate;
using NHibernate.Criterion;
using System.Web;
using System.Collections;
using PerfilEmpreendedor.Dao.Factory;
using System.Linq;

namespace PerfilEmpreendedor.Dao.Implements
{
    public class UsuarioDao:HibernateDao<Usuario>,IUsuarioDao
    {
        public Usuario Autenticar(string login, string senha)
        {
            ICriteria query = session.CreateCriteria(typeof(Usuario));
            query.Add(Restrictions.Eq("Login", login).IgnoreCase());
            query.Add(Restrictions.Eq("Senha", senha).IgnoreCase());

            if (query.List().Count > 0)
            {
                return query.List<Usuario>()[0];
            }
            else
            {
                return null;
            }

        }



        public bool LoginValido(string login)
        {
            ICriteria query = session.CreateCriteria(typeof(Usuario));
            query.Add(Restrictions.Eq("Login", login).IgnoreCase());
            return query.List().Count < 1;
        }


        public IList<Usuario> Pesquisar(string key)
        {
            return session.CreateCriteria(typeof(Usuario))
               .Add(Restrictions.Like("Login", "%" + key + "%"))
               .List<Usuario>();
        }


        public IList<Ranking> ObterTop20()
        {
            IList lstPontos = new ArrayList();
            Boolean Finalizado = false;
            Usuario vencedor = null;
            IList<Usuario> lstJogadores=session.QueryOver<Usuario>().Where(x=>x.Login!="Admin").List();

            IList<Historico> Historicos = session.QueryOver<Historico>().List();

            IList<Ranking> lstRanking = new List<Ranking>();

            foreach (var jog in lstJogadores)
            {
                Int32 pontos = 0;
                IList<Historico> lst1 = Historicos.Where(x => x.Jogador.Id == jog.Id && x.Acertou).ToList();
                Int32 parcialComoJogador = 0;
                foreach (var hist in lst1)
                {
                    parcialComoJogador += hist.Cartela.Dicas.Count - hist.Dicas.Count;

                }
                pontos += parcialComoJogador;
                IList<Historico> lst2 = Historicos.Where(x => x.Emissor != null && x.Emissor.Id == jog.Id && x.Acertou).ToList();
                Int32 parcialComoEmissor = 0;
                foreach (var hist in lst2)
                {
                    parcialComoEmissor += hist.Dicas.Count;

                }
                pontos += parcialComoEmissor;
                lstRanking.Add(new Ranking() { Jogador = jog.Login, Pontuacao = pontos });
            }

            return lstRanking.OrderByDescending(x => x.Pontuacao).Take(20).ToList();

        }
    }
}
